﻿#include <array>
#include <bitset>
#include <vector>
#include <map>
#include "private/FavoriteAttributesPrivate.h"
#include "FavoriteAttributes.h"

double FavoriteAttributes::enc1() const {
	Q_D(const FavoriteAttributes);
	std::array arr{ 0ui8,0ui8,0ui8,0ui8 };
	auto h = d->m_vm.at(70);
	auto l = d->m_vm.at(71);
	arr[2] = l & 0xff;
	arr[3] = l >> 8;
	arr[0] = h & 0xff;
	arr[1] = h >> 8;
	return reinterpret_cast<float&> (arr);
}

double FavoriteAttributes::enc2() const {
	Q_D(const FavoriteAttributes);
	std::array arr{ 0ui8,0ui8,0ui8,0ui8 };
	auto h = d->m_vm.at(72);
	auto l = d->m_vm.at(73);
	arr[2] = l & 0xff;
	arr[3] = l >> 8;
	arr[0] = h & 0xff;
	arr[1] = h >> 8;
	return reinterpret_cast<float&> (arr);
}

double FavoriteAttributes::enc3() const {
	Q_D(const FavoriteAttributes);
	std::array arr{ 0ui8,0ui8,0ui8,0ui8 };
	auto h = d->m_vm.at(74);
	auto l = d->m_vm.at(75);
	arr[2] = l & 0xff;
	arr[3] = l >> 8;
	arr[0] = h & 0xff;
	arr[1] = h >> 8;
	return reinterpret_cast<float&> (arr);
}

double FavoriteAttributes::enc1L1() const {
	Q_D(const FavoriteAttributes);
	std::array arr{ 0ui8,0ui8,0ui8,0ui8 };
	auto h = d->m_vm.at(109);
	auto l = d->m_vm.at(110);
	arr[2] = l & 0xff;
	arr[3] = l >> 8;
	arr[0] = h & 0xff;
	arr[1] = h >> 8;
	return reinterpret_cast<float&> (arr);
}

double FavoriteAttributes::enc1L7() const {
	Q_D(const FavoriteAttributes);
	std::array arr{ 0ui8,0ui8,0ui8,0ui8 };
	auto h = d->m_vm.at(121);
	auto l = d->m_vm.at(122);
	arr[2] = l & 0xff;
	arr[3] = l >> 8;
	arr[0] = h & 0xff;
	arr[1] = h >> 8;
	return reinterpret_cast<float&> (arr);
}

double FavoriteAttributes::headMin() const {
	Q_D(const FavoriteAttributes);
	double value = d->m_vm.at(126);
	return value;
}

double FavoriteAttributes::headMax() const {
	Q_D(const FavoriteAttributes);
	double value = d->m_vm.at(125);
	return value;
}

double FavoriteAttributes::head() const {
	return ai9();
}

bool FavoriteAttributes::backHasDrill() const {
	Q_D(const FavoriteAttributes);
	std::bitset<16> bits(d->m_vm.at(108));
	return bits.test(0);
}

bool FavoriteAttributes::middeHasDrill() const {
	Q_D(const FavoriteAttributes);
	std::bitset<16> bits(d->m_vm.at(108));
	return bits.test(1);
}

bool FavoriteAttributes::frontHasDrill() const {
	Q_D(const FavoriteAttributes);
	std::bitset<16> bits(d->m_vm.at(108));
	return bits.test(2);
}

bool FavoriteAttributes::autoPush() const {
	Q_D(const FavoriteAttributes);
	std::bitset<16> bits(d->m_vm.at(1));
	return bits.test(0);
}

bool FavoriteAttributes::autoPull() const {
	Q_D(const FavoriteAttributes);
	std::bitset<16> bits(d->m_vm.at(1));
	return bits.test(1);
}

bool FavoriteAttributes::isStarted() const {
	Q_D(const FavoriteAttributes);
	std::bitset<16> bits(d->m_vm.at(1));
	return bits.test(2);
}

bool FavoriteAttributes::isStopped() const {
	Q_D(const FavoriteAttributes);
	std::bitset<16> bits(d->m_vm.at(1));
	return bits.test(4);
}

bool FavoriteAttributes::isPaused() const {
	Q_D(const FavoriteAttributes);
	std::bitset<16> bits(d->m_vm.at(1));
	return bits.test(3);
}

bool FavoriteAttributes::okState() const {
	Q_D(const FavoriteAttributes);
	std::bitset<16> bits(d->m_vm.at(1));
	return bits.test(5);
}

bool FavoriteAttributes::cancelState() const {
	Q_D(const FavoriteAttributes);
	std::bitset<16> bits(d->m_vm.at(1));
	return bits.test(6);
}

bool FavoriteAttributes::pumpRunning() const {
	Q_D(const FavoriteAttributes);
	quint16 value = d->m_vm.at(166);
	if (value == 0xaa55) {
		return true;
	}
	else if (value == 0x5555){
		return false;
	}
	else {
		return false;
	}
}

int FavoriteAttributes::do1() const {
	REGISTER_GETTER_L(2)
}

int FavoriteAttributes::do2() const {
	REGISTER_GETTER_H(2)
}

int FavoriteAttributes::do3() const {
	REGISTER_GETTER_L(3)
}

int FavoriteAttributes::do4() const {
	REGISTER_GETTER_H(3)
}

int FavoriteAttributes::do5() const {
	REGISTER_GETTER_L(4)
}

int FavoriteAttributes::do6() const {
	REGISTER_GETTER_H(4)
}

int FavoriteAttributes::do7() const {
	REGISTER_GETTER_L(5)
}

int FavoriteAttributes::do8() const {
	REGISTER_GETTER_H(5)
}

int FavoriteAttributes::do9() const {
	REGISTER_GETTER_L(6)
}

int FavoriteAttributes::do10() const {
	REGISTER_GETTER_H(6)
}

int FavoriteAttributes::do11() const {
	REGISTER_GETTER_L(7)
}

int FavoriteAttributes::do12() const {
	REGISTER_GETTER_H(7)
}

int FavoriteAttributes::do13() const {
	REGISTER_GETTER_L(8)
}

int FavoriteAttributes::do14() const {
	REGISTER_GETTER_H(7)
}

int FavoriteAttributes::do15() const {
	REGISTER_GETTER_L(9)
}

int FavoriteAttributes::do16() const {
	REGISTER_GETTER_H(9)
}

int FavoriteAttributes::do17() const {
	REGISTER_GETTER_L(10)
}

int FavoriteAttributes::do18() const {
	REGISTER_GETTER_H(10)
}

int FavoriteAttributes::do19() const {
	REGISTER_GETTER_L(11)
}

int FavoriteAttributes::do20() const {
	REGISTER_GETTER_H(11)
}

int FavoriteAttributes::do21() const {
	REGISTER_GETTER_L(12)
}

int FavoriteAttributes::do22() const {
	REGISTER_GETTER_H(12)
}

int FavoriteAttributes::do23() const {
	REGISTER_GETTER_L(13)
}

int FavoriteAttributes::do24() const {
	REGISTER_GETTER_H(13)
}

int FavoriteAttributes::do25() const {
	REGISTER_GETTER_L(14)
}

int FavoriteAttributes::do26() const {
	REGISTER_GETTER_H(14)
}

int FavoriteAttributes::do27() const {
	REGISTER_GETTER_L(15)
}

int FavoriteAttributes::do28() const {
	REGISTER_GETTER_H(15)
}

int FavoriteAttributes::do29() const {
	REGISTER_GETTER_L(16)
}

int FavoriteAttributes::do30() const {
	REGISTER_GETTER_H(16)
}

int FavoriteAttributes::do31() const {
	REGISTER_GETTER_L(17)
}

int FavoriteAttributes::do32() const {
	REGISTER_GETTER_H(17)
}

int FavoriteAttributes::do33() const {
	REGISTER_GETTER_L(18)
}

int FavoriteAttributes::do34() const {
	REGISTER_GETTER_H(18)
}

int FavoriteAttributes::do35() const {
	REGISTER_GETTER_L(19)
}

int FavoriteAttributes::do36() const {
	REGISTER_GETTER_H(19)
}

int FavoriteAttributes::do37() const {
	REGISTER_GETTER_L(20)
}

int FavoriteAttributes::do38() const {
	REGISTER_GETTER_H(20)
}

int FavoriteAttributes::do39() const {
	REGISTER_GETTER_L(21)
}

int FavoriteAttributes::do40() const {
	REGISTER_GETTER_H(21)
}

int FavoriteAttributes::do41() const {
	REGISTER_GETTER_L(22)
}

int FavoriteAttributes::do42() const {
	REGISTER_GETTER_H(22)
}

int FavoriteAttributes::do43() const {
	REGISTER_GETTER_L(23)
}

int FavoriteAttributes::do44() const {
	REGISTER_GETTER_H(23)
}

int FavoriteAttributes::do45() const {
	REGISTER_GETTER_L(24)
}

int FavoriteAttributes::do46() const {
	REGISTER_GETTER_H(24)
}

int FavoriteAttributes::do47() const {
	REGISTER_GETTER_L(25)
}

int FavoriteAttributes::do48() const {
	REGISTER_GETTER_H(25)
}

int FavoriteAttributes::do49() const {
	REGISTER_GETTER_L(26)
}

int FavoriteAttributes::do50() const {
	REGISTER_GETTER_H(26)
}

int FavoriteAttributes::do51() const {
	REGISTER_GETTER_L(27)
}

int FavoriteAttributes::do52() const {
	REGISTER_GETTER_H(27)
}

int FavoriteAttributes::do53() const {
	REGISTER_GETTER_L(28)
}

int FavoriteAttributes::do54() const {
	REGISTER_GETTER_H(28)
}

int FavoriteAttributes::do55() const {
	REGISTER_GETTER_L(29)
}

int FavoriteAttributes::do56() const {
	REGISTER_GETTER_H(29)
}

int FavoriteAttributes::do57() const {
	REGISTER_GETTER_L(30)
}

int FavoriteAttributes::do58() const {
	REGISTER_GETTER_H(30)
}

int FavoriteAttributes::do59() const {
	REGISTER_GETTER_L(31)
}

int FavoriteAttributes::do60() const {
	REGISTER_GETTER_H(31)
}

int FavoriteAttributes::do61() const {
	REGISTER_GETTER_L(32)
}

int FavoriteAttributes::do62() const {
	REGISTER_GETTER_H(32)
}

int FavoriteAttributes::do63() const {
	REGISTER_GETTER_L(33)
}

int FavoriteAttributes::do64() const {
	REGISTER_GETTER_H(33)
}

int FavoriteAttributes::ai1() const {
	REGISTER_GETTER(50)
}

int FavoriteAttributes::ai2() const {
	REGISTER_GETTER(51)
}

int FavoriteAttributes::ai3() const {
	REGISTER_GETTER(52)
}

int FavoriteAttributes::ai4() const {
	REGISTER_GETTER(53)
}

int FavoriteAttributes::ai5() const {
	REGISTER_GETTER(54)
}

int FavoriteAttributes::ai6() const {
	REGISTER_GETTER(55)
}

int FavoriteAttributes::ai7() const {
	REGISTER_GETTER(56)
}

int FavoriteAttributes::ai8() const {
	REGISTER_GETTER(57)
}

int FavoriteAttributes::ai9() const {
	REGISTER_GETTER(58)
}

int FavoriteAttributes::ai10() const {
	REGISTER_GETTER(59)
}

int FavoriteAttributes::ai11() const {
	REGISTER_GETTER(60)
}

int FavoriteAttributes::ai12() const {
	REGISTER_GETTER(61)
}

int FavoriteAttributes::ai13() const {
	REGISTER_GETTER(62)
}

int FavoriteAttributes::ai14() const {
	REGISTER_GETTER(63)
}

int FavoriteAttributes::ai15() const {
	REGISTER_GETTER(64)
}

int FavoriteAttributes::ai16() const {
	REGISTER_GETTER(65)
}

int FavoriteAttributes::di() const {
	REGISTER_GETTER(66)
}



FavoriteAttributes::FavoriteAttributes(QObject* parent /*= nullptr*/)
	: QObject(parent)
	, m_parser(std::make_unique<FavoriteAttributesPrivate>(this))

{
	Q_D(FavoriteAttributes);
	DECODE_ADD_FUNCTION(1)
	DECODE_ADD_FUNCTION(2)
	DECODE_ADD_FUNCTION(3)
	DECODE_ADD_FUNCTION(4)
	DECODE_ADD_FUNCTION(5)
	DECODE_ADD_FUNCTION(6)
	DECODE_ADD_FUNCTION(7)
	DECODE_ADD_FUNCTION(8)
	DECODE_ADD_FUNCTION(9)
	DECODE_ADD_FUNCTION(10)
	DECODE_ADD_FUNCTION(11)
	DECODE_ADD_FUNCTION(12)
	DECODE_ADD_FUNCTION(13)
	DECODE_ADD_FUNCTION(14)
	DECODE_ADD_FUNCTION(15)
	DECODE_ADD_FUNCTION(16)
	DECODE_ADD_FUNCTION(17)
	DECODE_ADD_FUNCTION(18)
	DECODE_ADD_FUNCTION(19)
	DECODE_ADD_FUNCTION(20)
	DECODE_ADD_FUNCTION(21)
	DECODE_ADD_FUNCTION(22)
	DECODE_ADD_FUNCTION(23)
	DECODE_ADD_FUNCTION(24)
	DECODE_ADD_FUNCTION(25)
	DECODE_ADD_FUNCTION(26)
	DECODE_ADD_FUNCTION(27)
	DECODE_ADD_FUNCTION(28)
	DECODE_ADD_FUNCTION(29)
	DECODE_ADD_FUNCTION(30)
	DECODE_ADD_FUNCTION(31)
	DECODE_ADD_FUNCTION(32)
	DECODE_ADD_FUNCTION(33)
	DECODE_ADD_FUNCTION(50)
	DECODE_ADD_FUNCTION(51)
	DECODE_ADD_FUNCTION(52)
	DECODE_ADD_FUNCTION(53)
	DECODE_ADD_FUNCTION(54)
	DECODE_ADD_FUNCTION(55)
	DECODE_ADD_FUNCTION(56)
	DECODE_ADD_FUNCTION(57)
	DECODE_ADD_FUNCTION(58)
	DECODE_ADD_FUNCTION(59)
	DECODE_ADD_FUNCTION(60)
	DECODE_ADD_FUNCTION(61)
	DECODE_ADD_FUNCTION(62)
	DECODE_ADD_FUNCTION(63)
	DECODE_ADD_FUNCTION(64)
	DECODE_ADD_FUNCTION(65)
	DECODE_ADD_FUNCTION(66)
	DECODE_ADD_MUTI_FUNCTION(70)
	DECODE_ADD_MUTI_FUNCTION(72)
	DECODE_ADD_MUTI_FUNCTION(74)
	DECODE_ADD_FUNCTION(108)
	DECODE_ADD_MUTI_FUNCTION(109)
	DECODE_ADD_MUTI_FUNCTION(121)
	DECODE_ADD_FUNCTION(125)
	DECODE_ADD_FUNCTION(126)
	DECODE_ADD_FUNCTION(166)

	DECODE_ADD_MUTI_FUNCTION(201)
	DECODE_ADD_MUTI_FUNCTION(203)
	DECODE_ADD_MUTI_FUNCTION(205)
	DECODE_ADD_MUTI_FUNCTION(207)
	DECODE_ADD_MUTI_FUNCTION(223)
	DECODE_ADD_MUTI_FUNCTION(225)
}

FavoriteAttributes::~FavoriteAttributes() {

}

bool FavoriteAttributes::hasFavorite(int address) const {
	Q_D(const FavoriteAttributes);
	return std::find(std::cbegin(d->m_favoriteReg), std::cend(d->m_favoriteReg), address) != std::cend(d->m_favoriteReg);
}

bool FavoriteAttributes::hasMulti(int address, int& byteCount) const {
	Q_D(const FavoriteAttributes);
	auto it = d->m_needBytes.find(address);
	if (it == std::cend(d->m_needBytes)) {
		return false;
	}
	byteCount = it->second;
	return true;
}

bool FavoriteAttributes::update(int address, quint16 value) {
	auto it = m_decoderMap.equal_range(address);
	if (it.first != std::cend(m_decoderMap)) {
		for (auto itFunc = it.first; itFunc != it.second; itFunc++) {
			itFunc->second(value);
		}
	}
	Q_D(const FavoriteAttributes);
	return d->isOnlyinFavorite(address);
}

bool FavoriteAttributes::update(int address, QList<quint16> values) {
	auto it = m_multiDecoderMap.equal_range(address);
	if (it.first != std::cend(m_multiDecoderMap)) {
		for (auto itFunc = it.first; itFunc != it.second; itFunc++) {
			itFunc->second(values);
		}
	}
	Q_D(const FavoriteAttributes);
	return d->isOnlyinFavorite(address);
}
